/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo5;

import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uca.dss.curso2011.grupo5.interfazExtendido.InterfazListados;
import org.uca.dss.curso2011.grupo5.interfazExtendido.Itinerario;

/**
 * Implementacion de la interfaz InterfazListados
 * @author Diego
 */
public class GestionItinerarios implements InterfazListados
{

    List<Trayecto> ltrayectos;

    /**
     *
     * @param ltrayectos lista de trayectos disponibles en la agencia.
     */
    public GestionItinerarios (List<Trayecto> ltrayectos) throws IllegalArgumentException
    {
        Args.comprobarNulo(ltrayectos);

        this.ltrayectos = ltrayectos;
    }

    /**
     * Permite obtener la disponibilidad de un viaje, mostrando para dicho
     * origen y destino el viaje (considerando la posibilidad de realizar
     * un trayecto).
     * No se mostrarán las combinaciones horas para las cuales no hay asientos
     * disponibles en alguno de los trayectos.
     * Mostrará todos los viajes que cumplan los requisitos horarios indicados.
     *
     * @param origen ciudad origen
     * @param destino ciudad destino
     * @param fecha fecha de inicio viaje
     * @param horaSalida indica la hora a partir del cual el viaje puede empezar
     * @param horaLlegada indica la hora máxima de llegada
     * @return un array con los itinerarios posibles
     */
    public List<Itinerario> getItinerariosEntre(String origen, String destino,
            LocalDate fechaSalida, LocalTime horaSalida, LocalTime horaLlegada) throws IllegalArgumentException
    {
        // Compruebo argumentos
        Args.comprobarCadena(origen);
        Args.comprobarCadena(destino);
        Args.comprobarNulo(fechaSalida);
        Args.comprobarNulo(horaSalida);
        Args.comprobarNulo(horaLlegada);

        Transbordo t = new Transbordo(ltrayectos);

        List<Itinerario> itinerarios = t.obtenerItinerarios(origen, destino, fechaSalida);        

        for(Itinerario itinerario : itinerarios)
        {
           // Descarto los que están fuera de hora
           if(itinerario.get(0).getHoraSalida().isBefore(horaSalida) || itinerario.get(1).getHoraLlegada().isAfter(horaLlegada))
           {
               itinerarios.remove(itinerario);
            }
        }

        return itinerarios;
    }
    
    /**
     * Permite obtener la disponibilidad de un viaje, mostrando para dicho
     * origen y destino el viaje (considerando la posibilidad de realizar
     * un trayecto).
     * No se mostrarán las combinaciones horas para las cuales no hay asientos
     * disponibles en alguno de los trayectos.
     * Es equivalente al método getHorariosEntre pero sin imporer requisitos
     * horarios.
     *
     * @param origen ciudad origen
     * @param destino ciudad destino
     * @param fecha fecha de inicio viaje
     * @param horaSalida indica la hora a partir del cual el viaje puede empezar
     * @param horaLlegada indica la hora máxima de llegada
     * @return un array con los itinerarios posibles
     */
    public List<Itinerario> getItinerarios(String origen, String destino, LocalDate fechaSalida) throws IllegalArgumentException
    {
        // Compruebo argumentos
        Args.comprobarCadena(origen);
        Args.comprobarCadena(destino);
        Args.comprobarNulo(fechaSalida);

        Transbordo t = new Transbordo(ltrayectos);

        return t.obtenerItinerarios(origen, destino, fechaSalida);
    }
}
